﻿using BLevy.Datos.Interfases;
using BLevy.Entidad;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using DapperExtensions;

namespace BLevy.Datos.Repositories
{
    public interface ICuentaBancariaRepository : IRepository<CuentaBancaria>
    {
        CuentaBancaria FindByIdSocio(int socio_id);
    }

    public class CuentaBancariaRepository : ICuentaBancariaRepository
    {
        protected readonly IDbConnection _db;

        public CuentaBancariaRepository()
        {
            try
            {
                _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString());
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IList<CuentaBancaria> FindAll()
        {
            throw new NotImplementedException();
        }

        public IQueryable<CuentaBancaria> Find(System.Linq.Expressions.Expression<Func<CuentaBancaria, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public CuentaBancaria FindById(int id)
        {
            throw new NotImplementedException();
        }

        public int Add(CuentaBancaria newEntity)
        {
            const string query = "INSERT INTO CUENTASBANCARIAS (FECHA_REGISTRO, SOCIO_ID, APELLIDO, NOMBRES, DOCUMENTO, " +
            "DIRECCION, LOCALIDAD_ID, ZONA_ID, TELEFONO, CBU, ACTIVO) VALUES (@fecha_registro, @socio_id, @apellido, @nombres, @documento, " +
            "@direccion, @localidad_id, @zona_id, @telefono, @cbu, @activo);" +
            "SELECT LAST_INSERT_ID()";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<int>(query, new
                    {
                        fecha_registro = newEntity.fecha_registro,
                        socio_id = newEntity.socio_id,
                        apellido = newEntity.apellido,
                        nombres = newEntity.nombres,
                        documento = newEntity.documento,
                        direccion = newEntity.direccion,
                        localidad_id = newEntity.localidad.id,
                        zona_id = newEntity.zona.id,
                        telefono = newEntity.telefono,
                        cbu = newEntity.cbu,
                        activo = 1

                    }).Single();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Remove(int id)
        {
            const string query = "UPDATE CUENTASBANCARIAS SET ACTIVO = 0 " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new { id = id });
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public int Modify(CuentaBancaria entity)
        {
            const string query = "UPDATE CUENTASBANCARIAS SET APELLIDO = @apellido, NOMBRES = @nombres, DOCUMENTO = @documento, " +
                "DIRECCION = @direccion, LOCALIDAD_ID = @localidad_id, ZONA_ID = @zona_id, TELEFONO = @telefono, CBU = @cbu, ACTIVO = @activo " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        apellido = entity.apellido,
                        nombres = entity.nombres,
                        documento = entity.documento,
                        direccion = entity.direccion,
                        localidad_id = entity.localidad.id,
                        zona_id = entity.zona.id,
                        telefono = entity.telefono,
                        cbu = entity.cbu,
                        activo = entity.activo,
                        id = entity.id
                    });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public CuentaBancaria FindByIdSocio(int socio_id)
        {
            const string query = "SELECT * FROM CUENTASBANCARIAS " +
                "WHERE SOCIO_ID = @socio_id AND ACTIVO = 1";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<CuentaBancaria>(query, new { socio_id = socio_id }).SingleOrDefault();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }
    }
}
